#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
    int data;
    struct link *next;
} link;

link *init(){
    link *l=malloc(sizeof(link));
    l->data=0;
    l->next=NULL;
    return l;
}
void headinsert(link *l){
    printf("输入一个数，0 是结束");
    int n;
    scanf("%d",&n);
    while (n!=0)
    {
        link *newl=malloc(sizeof(link));
        newl->data=n;
        newl->next=l->next;
        l->next=newl;
        printf("输入一个数，0 是结束");
        scanf("%d",&n);
    }
    
}
link * findtail(link *l){
    while (l->next!=NULL)
    {
        l=l->next;
    }
    return l;
}
void tailinsert(link *l){
    link *taillink=findtail(l);
    printf("输入一个数，0代表结束\n");
    int n;
    scanf("%d",&n);
    while (n!=0)
    {
        link *newlink=malloc(sizeof(link));
        newlink->data=n;
        newlink->next=NULL;
        taillink->next=newlink;
        taillink=newlink;
        printf("输入一个数，0代表结束\n");
        scanf("%d",&n);
    }
    
}
void selectall(link *la){
    link *l=la;
    while (l!=NULL)
    {
        printf("%d\n",l->data);
        l=l->next;
    }
    
}
link *findlinkbydata(link *l,int d){
    while (l!=NULL)
    {
        if(l->data==d){
            break;
        }
        l=l->next;
    }
    return l;
    
}
void deletebydata(link *l,int data){
    link *dlink=findlinkbydata(l,data);
    if (dlink!=NULL)
    {
        dlink->data=dlink->next->data;
        dlink->next=dlink->next->next;
    }
    else{
        printf("不存在这个数据\n ");
    }
    
    
}
void updatebydata(link *l,int data,int newdata){
    link *updatelink=findlinkbydata(l,data);
    if(updatelink!=NULL){
        updatelink->data=newdata;
    }
    else{
        printf("不存在这个数据\n");
    }
}
void insertafterdata(link *l,int afterdata,int newdata){
    link *afterlink=findlinkbydata(l,afterdata);
    if (afterlink!=NULL)
    {
       link *newlink=malloc(sizeof(link));
       newlink->data=newdata;
       newlink->next=afterlink->next;
       afterlink->next=newlink;
    }
    else{
        printf("没有这个数据");
    }
    
}
int main()
{
    link *l=init();
    int chose;
    
    while (1==1)
    {
        printf("1头插法，2尾插法，3遍历整个链表,4删除，5修改,6在一个数据节点后插入");
        scanf("%d",&chose);
        switch (chose){
            case 1:headinsert(l);break;
            case 2:tailinsert(l);break;
            case 3:selectall(l);break;
            case 4:printf("输入删除的数字");
            int dn;
            scanf("%d",&dn);
            deletebydata(l,dn);
            break;
            case 5:printf("输入修改的数字");
            int un;
            scanf("%d",&un);
            printf("输入修改后的数字");
            int afterun;
            scanf("%d",&afterun);
            updatebydata(l,un,afterun);break;
            case 6:printf("在那个数据后面插入数据");
            int afterdata;
            scanf("%d",&afterdata);
            printf("插入什么数据");
            int newdata;
            scanf("%d",&newdata);
            insertafterdata(l,afterdata,newdata);break;
            default:break;
        }
    }
    
    return 0;
}
